/**
 * 深夜模式工具类
 * 提供深夜模式的切换、存储和初始化功能
 */

class DarkModeManager {
  constructor() {
    // 深夜模式的CSS类名
    this.darkModeClass = 'dark-mode';
    // 本地存储的键名
    this.storageKey = 'element-ui-dark-mode';
    // 是否已初始化
    this.initialized = false;
  }

  /**
   * 初始化深夜模式
   * 从本地存储读取设置并应用，默认为深夜模式
   */
  init() {
    if (this.initialized) {
      return;
    }

    // 从本地存储读取深夜模式设置
    const isDarkMode = this.getStoredDarkMode();

    // 应用深夜模式设置（默认为深夜模式）
    if (isDarkMode) {
      this.enable();
    } else {
      this.disable();
    }

    this.initialized = true;
  }

  /**
   * 启用深夜模式
   */
  enable() {
    // 添加深夜模式CSS类到body元素
    document.body.classList.add(this.darkModeClass);
    document.body.classList.add('dark-mode-transition');

    // 存储设置到本地存储
    this.storeDarkMode(true);

    // 触发自定义事件
    this.triggerEvent('darkModeEnabled');

    console.log('深夜模式已启用');
  }

  /**
   * 禁用深夜模式
   */
  disable() {
    // 移除深夜模式CSS类
    document.body.classList.remove(this.darkModeClass);
    document.body.classList.add('dark-mode-transition');

    // 存储设置到本地存储
    this.storeDarkMode(false);

    // 触发自定义事件
    this.triggerEvent('darkModeDisabled');

    console.log('深夜模式已禁用');
  }

  /**
   * 切换深夜模式
   */
  toggle() {
    if (this.isEnabled()) {
      this.disable();
    } else {
      this.enable();
    }
  }

  /**
   * 检查深夜模式是否已启用
   * @returns {boolean} 是否启用深夜模式
   */
  isEnabled() {
    return document.body.classList.contains(this.darkModeClass);
  }

  /**
   * 获取存储的深夜模式设置
   * @returns {boolean} 存储的深夜模式状态
   */
  getStoredDarkMode() {
    try {
      const stored = localStorage.getItem(this.storageKey);
      // 如果没有存储过设置，默认返回 true（启用深夜模式）
      if (stored === null) {
        return true;
      }
      return stored === 'true';
    } catch (error) {
      console.warn('无法读取本地存储的深夜模式设置:', error);
      return true; // 出错时也默认启用深夜模式
    }
  }

  /**
   * 存储深夜模式设置到本地存储
   * @param {boolean} isDarkMode 是否启用深夜模式
   */
  storeDarkMode(isDarkMode) {
    try {
      localStorage.setItem(this.storageKey, isDarkMode.toString());
    } catch (error) {
      console.warn('无法保存深夜模式设置到本地存储:', error);
    }
  }

  /**
   * 触发自定义事件
   * @param {string} eventName 事件名称
   */
  triggerEvent(eventName) {
    const event = new CustomEvent(eventName, {
      detail: {
        isDarkMode: this.isEnabled()
      }
    });
    document.dispatchEvent(event);
  }

  /**
   * 监听深夜模式变化事件
   * @param {Function} callback 回调函数
   */
  onDarkModeChange(callback) {
    document.addEventListener('darkModeEnabled', callback);
    document.addEventListener('darkModeDisabled', callback);
  }

  /**
   * 移除深夜模式变化事件监听
   * @param {Function} callback 回调函数
   */
  offDarkModeChange(callback) {
    document.removeEventListener('darkModeEnabled', callback);
    document.removeEventListener('darkModeDisabled', callback);
  }

  /**
   * 根据系统偏好自动切换深夜模式
   */
  autoSwitch() {
    // 检查系统是否支持prefers-color-scheme
    if (window.matchMedia) {
      const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');

      // 监听系统主题变化
      const handleChange = (e) => {
        if (e.matches) {
          this.enable();
        } else {
          // 如果系统是浅色模式，但用户没有明确设置过，则默认使用深夜模式
          const hasUserPreference = localStorage.getItem(this.storageKey) !== null;
          if (!hasUserPreference) {
            this.enable();
          } else {
            this.disable();
          }
        }
      };

      // 初始检查
      handleChange(mediaQuery);

      // 监听变化
      mediaQuery.addListener(handleChange);

      console.log('已启用自动深夜模式切换');
    } else {
      console.warn('当前浏览器不支持自动深夜模式切换');
      // 如果不支持系统主题检测，默认启用深夜模式
      this.enable();
    }
  }

  /**
   * 获取当前主题信息
   * @returns {Object} 主题信息对象
   */
  getThemeInfo() {
    return {
      isDarkMode: this.isEnabled(),
      isAutoMode: false, // 可以扩展为自动模式检测
      storageKey: this.storageKey,
      initialized: this.initialized
    };
  }
}

// 创建单例实例
const darkModeManager = new DarkModeManager();

// 自动初始化
if (typeof document !== 'undefined') {
  // 等待DOM加载完成
  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', () => {
      darkModeManager.init();
    });
  } else {
    darkModeManager.init();
  }
}

// 导出工具函数
export default {
  // 初始化深夜模式
  init: () => darkModeManager.init(),

  // 启用深夜模式
  enable: () => darkModeManager.enable(),

  // 禁用深夜模式
  disable: () => darkModeManager.disable(),

  // 切换深夜模式
  toggle: () => darkModeManager.toggle(),

  // 检查是否启用
  isEnabled: () => darkModeManager.isEnabled(),

  // 自动切换
  autoSwitch: () => darkModeManager.autoSwitch(),

  // 获取主题信息
  getThemeInfo: () => darkModeManager.getThemeInfo(),

  // 事件监听
  onDarkModeChange: (callback) => darkModeManager.onDarkModeChange(callback),
  offDarkModeChange: (callback) => darkModeManager.offDarkModeChange(callback),

  // 管理器实例（高级用法）
  manager: darkModeManager
};

// 在全局对象上暴露（可选）
if (typeof window !== 'undefined') {
  window.ElementUIDarkMode = {
    init: () => darkModeManager.init(),
    enable: () => darkModeManager.enable(),
    disable: () => darkModeManager.disable(),
    toggle: () => darkModeManager.toggle(),
    isEnabled: () => darkModeManager.isEnabled(),
    autoSwitch: () => darkModeManager.autoSwitch(),
    getThemeInfo: () => darkModeManager.getThemeInfo()
  };
}
